#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : Lv Shenkai
# @Time    : 2021/12/21 16:15
# @File    : elbow_rule.py
# @Function: 画出拐点图
import pandas
import matplotlib.pyplot as plt

from cluster.cluster_tool import Cluster_tool
from dataload.dataset import DataSet
from dataload.oracle_link import get_data_from_database, classify_train_and_test
from parameter.parameter import Parameter

max_num_center = 30
X = list(range(1, max_num_center + 1))
flights = ['8616', '8501', '8217']
flight_name = ['普通线', '商务线', '旅游线']

# 保存路径
save_path = r'./elbow/'

# 不同的DCP聚类
DCP_idx = [16, 20, 23]
DCP = [9, 5, 2]
for i in range(len(DCP_idx)):
    end = DCP_idx[i]
    end_list = list()  # 保存各个航班的畸变值情况
    # 不同的航班
    for flight_no in flights:
        print('DCP', DCP[i], ':', flight_no)
        # 从数据库中得到数据
        data_list_dic = get_data_from_database(flight_no)
        # 数据分为训练数据和测试数据
        data_train, data_test = classify_train_and_test(data_list_dic)
        # 加载数据
        data = DataSet.data_load(data_train)
        # 构造聚类工具实例
        cluster_tool = Cluster_tool(data)
        # 所有的聚类中心列名
        cluster_centers = pandas.DataFrame(columns=Parameter.COLUMNS_CENTER.value)
        # 获得最佳的聚类中心个数,以及各个聚类数的畸变值
        best_num_center, elbow_result = cluster_tool.elbow_rule(max_num_center=max_num_center,
                                                                start=Parameter.START.value,
                                                                end=end)
        end_list.append(elbow_result)

    '''开始画图'''
    # 设置中文编码问题
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    # 设置背景网格
    plt.grid(linestyle='-.')
    # 逐个添加线
    for idx in range(len(flights)):
        Y = end_list[idx]
        title = flight_name[idx]
        plt.plot(X, Y, label=title)

    # 设置边缘大小
    # plt.margins(3)

    # # 调整子图布局
    # plt.subplots_adjust(bottom=0.15)

    # 设置背景网格
    plt.grid(linestyle='-.')

    # 添加图例
    plt.legend(prop={'size': 10})

    # 设置轴标签名
    plt.xlabel('聚类中心数', fontsize=15)  # X轴标签
    plt.ylabel('畸变值', fontsize=15)  # X轴标签

    # 添加标题
    plt.title('DCP' + str(DCP[i]))

    # 保存图片
    plt.savefig(save_path + 'DCP' + str(DCP[i]) + '.png')

    # 展示图
    # plt.show()

    # 清除画布
    plt.close('all')
